﻿// 这段 MFC 示例源代码演示如何使用 MFC Microsoft Office Fluent 用户界面
// (“Fluent UI”)。该示例仅供参考，
// 用以补充《Microsoft 基础类参考》和
// MFC C++ 库软件随附的相关电子文档。
// 复制、使用或分发 Fluent UI 的许可条款是单独提供的。
// 若要了解有关 Fluent UI 许可计划的详细信息，请访问
// https://go.microsoft.com/fwlink/?LinkId=238214.
//
// 版权所有(C) Microsoft Corporation
// 保留所有权利。

// MFCPaintView.h: CMFCPaintView 类的接口
//

#pragma once

#include<vector>
#include<stack>


// 定义当前使用的绘图方式
enum class DrawingType
{
	NONE,
	PEN,
	//RUBBER,
	LINE,
	RECTANGLE,
	TRIANGLE
};


struct DrawingOperation
{
	DrawingType type = DrawingType::NONE;
	std::vector<CPoint> points;  // 存储绘制的点
	int penWidth = 1; // 画笔的宽度
	COLORREF penColor = RGB(0, 0, 0); // 画笔的颜色
	COLORREF brushColor = RGB(0, 0, 0);  // 画刷的颜色
};


class CMFCPaintView : public CFormView
{
protected: // 仅从序列化创建
	CMFCPaintView() noexcept;
	DECLARE_DYNCREATE(CMFCPaintView)

public:
#ifdef AFX_DESIGN_TIME
	enum{ IDD = IDD_MFCPAINT_FORM };
#endif

// 特性
public:
	CMFCPaintDoc* GetDocument() const;

// 操作
public:

// 重写
public:
	virtual BOOL PreCreateWindow(CREATESTRUCT& cs);
protected:
	virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV 支持
	virtual void OnInitialUpdate(); // 构造后第一次调用
	virtual BOOL OnPreparePrinting(CPrintInfo* pInfo);
	virtual void OnBeginPrinting(CDC* pDC, CPrintInfo* pInfo);
	virtual void OnEndPrinting(CDC* pDC, CPrintInfo* pInfo);
	virtual void OnPrint(CDC* pDC, CPrintInfo* pInfo);
	virtual void OnDraw(CDC* pDC) override;

// 实现
public:
	virtual ~CMFCPaintView();
#ifdef _DEBUG
	virtual void AssertValid() const;
	virtual void Dump(CDumpContext& dc) const;
#endif

protected:
	std::vector<DrawingOperation> m_Drawings;  // 存储所有绘图操作
	std::vector<CPoint> m_CurrentPoints;  // 当前绘制的点

	std::stack<std::vector<DrawingOperation>> m_UndoStack;  // 撤销栈
	std::stack<std::vector<DrawingOperation>> m_doStack;    // 回溯栈

	bool m_bDrawing;   // 当前是否在绘制状态
	DrawingType m_CurrentType;  // 当前的状态

	CPen m_cachedPen; // 画笔对象
	COLORREF m_PenColor; // 画笔颜色

	CBrush m_cachedBrush; // 画刷对象
	COLORREF m_BrushColor; // 画刷颜色

	int m_nPenWidth; // 设置画笔的宽度
	int m_cachedPenWidth; // 当前画笔的宽度
	COLORREF m_cachedPenColor; // 当前画笔的颜色
	void SetPenWidth(int nWidth); //  设置画笔的宽度

	void SetFrameStatusText(CString name);

	//bool m_bErasing;   // 正在橡皮擦状态
	//bool m_bMouserInView;  // 鼠标是否在视图内
	//int m_EraserSize; // 橡皮擦的尺寸
	//UINT_PTR m_nEraserTimerID; // 定时器 ID
	//bool m_bTimerRunning;  // 定时器状态标志
	//CPoint m_EraserPos; // 橡皮擦中心点

	//void EraseAtPoint(CPoint point);   // 清除指定点范围内的数据

	

// 生成的消息映射函数
protected:
	afx_msg void OnFilePrintPreview();
	afx_msg void OnRButtonUp(UINT nFlags, CPoint point);
	afx_msg void OnContextMenu(CWnd* pWnd, CPoint point);
	DECLARE_MESSAGE_MAP()
public:
	afx_msg void OnPen();
	afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
	afx_msg void OnLButtonUp(UINT nFlags, CPoint point);
	afx_msg void OnMouseMove(UINT nFlags, CPoint point);
	afx_msg void OnDustbin();
	afx_msg void OnLine();
	afx_msg void OnRectangle();
	afx_msg void OnTriangle();
	//afx_msg void OnMouseHover(UINT nFlags, CPoint point);
	//afx_msg void OnMouseLeave();
	//afx_msg void OnTimer(UINT_PTR nIDEvent);
	afx_msg void OnCancel();
	afx_msg void OnRedo();
	afx_msg void OnSize();
	afx_msg void OnBordercolor();
	afx_msg void OnFillcolor();
	afx_msg void OnSaveView();
};

#ifndef _DEBUG  // MFCPaintView.cpp 中的调试版本
inline CMFCPaintDoc* CMFCPaintView::GetDocument() const
   { return reinterpret_cast<CMFCPaintDoc*>(m_pDocument); }
#endif

